/**
 * 日期工具函数
 * 提供时区处理和日期格式化功能
 */

/**
 * 获取系统时区
 * @returns string 时区字符串，如 'Asia/Shanghai'
 */
export function getTimeZone(): string {
  return Intl.DateTimeFormat().resolvedOptions().timeZone
}

/**
 * 在指定时区格式化日期为 YYYY-MM-DD 格式
 * @param date Date对象
 * @param timeZone 时区字符串
 * @returns string 格式化后的日期字符串
 */
export function formatDateInTimeZone(date: Date, timeZone: string): string {
  return date.toLocaleDateString('en-CA', {
    timeZone,
    year: 'numeric',
    month: '2-digit',
    day: '2-digit'
  })
}

/**
 * 在指定时区格式化日期时间为 YYYY-MM-DD HH:mm:ss 格式
 * @param date Date对象
 * @param timeZone 时区字符串
 * @returns string 格式化后的日期时间字符串
 */
export function formatDateTimeInTimeZone(date: Date, timeZone: string): string {
  return date.toLocaleString('en-CA', {
    timeZone,
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false
  }).replace(',', '')
}

/**
 * 获取当前时区的当前日期时间字符串
 * @returns string 当前日期时间字符串
 */
export function getCurrentDateTime(): string {
  const now = new Date()
  const timeZone = getTimeZone()
  return formatDateTimeInTimeZone(now, timeZone)
}

/**
 * 获取当前时区的当前日期字符串
 * @returns string 当前日期字符串
 */
export function getCurrentDate(): string {
  const now = new Date()
  const timeZone = getTimeZone()
  return formatDateInTimeZone(now, timeZone)
}

/**
 * 将日期字符串转换为指定时区的Date对象
 * @param dateString 日期字符串 (YYYY-MM-DD 或 YYYY-MM-DD HH:mm:ss)
 * @param timeZone 时区字符串
 * @returns Date 转换后的Date对象
 */
export function parseDateInTimeZone(dateString: string, timeZone: string): Date {
  // 如果是日期时间格式，先分割
  const [datePart, timePart = '00:00:00'] = dateString.split(' ')
  const [year, month, day] = datePart.split('-').map(Number)
  const [hours, minutes, seconds = 0] = timePart.split(':').map(Number)
  
  // 创建UTC时间的Date对象
  const date = new Date(Date.UTC(year, month - 1, day, hours, minutes, seconds))
  
  // 转换为目标时区的时间
  const timeZoneOffset = getTimeZoneOffset(timeZone)
  const localOffset = date.getTimezoneOffset()
  const adjustedDate = new Date(date.getTime() + (timeZoneOffset - localOffset) * 60000)
  
  return adjustedDate
}

/**
 * 获取指定时区的时区偏移量（分钟）
 * @param timeZone 时区字符串
 * @returns number 时区偏移量（分钟）
 */
function getTimeZoneOffset(timeZone: string): number {
  const now = new Date()
  const utcDate = new Date(now.toLocaleString('en-US', { timeZone: 'UTC' }))
  const tzDate = new Date(now.toLocaleString('en-US', { timeZone }))
  return (tzDate.getTime() - utcDate.getTime()) / (1000 * 60)
}

/**
 * 计算两个日期之间的天数差
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @returns number 天数差
 */
export function getDaysBetween(startDate: string, endDate: string): number {
  const start = new Date(startDate)
  const end = new Date(endDate)
  const timeDiff = end.getTime() - start.getTime()
  return Math.ceil(timeDiff / (1000 * 3600 * 24))
}

/**
 * 检查日期是否在指定范围内
 * @param date 要检查的日期
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @returns boolean 是否在范围内
 */
export function isDateInRange(date: string, startDate: string, endDate: string): boolean {
  const checkDate = new Date(date)
  const start = new Date(startDate)
  const end = new Date(endDate)
  return checkDate >= start && checkDate <= end
}

/**
 * 获取月份的天数
 * @param year 年份
 * @param month 月份 (1-12)
 * @returns number 该月的天数
 */
export function getDaysInMonth(year: number, month: number): number {
  return new Date(year, month, 0).getDate()
}

/**
 * 获取某个月的第一天和最后一天
 * @param year 年份
 * @param month 月份 (1-12)
 * @returns { firstDay: string, lastDay: string }
 */
export function getMonthRange(year: number, month: number): { firstDay: string, lastDay: string } {
  const timeZone = getTimeZone()
  const firstDay = new Date(year, month - 1, 1)
  const lastDay = new Date(year, month, 0)
  
  return {
    firstDay: formatDateInTimeZone(firstDay, timeZone),
    lastDay: formatDateInTimeZone(lastDay, timeZone)
  }
}

/**
 * 获取某年的第一天和最后一天
 * @param year 年份
 * @returns { firstDay: string, lastDay: string }
 */
export function getYearRange(year: number): { firstDay: string, lastDay: string } {
  const timeZone = getTimeZone()
  const firstDay = new Date(year, 0, 1)
  const lastDay = new Date(year, 11, 31)
  
  return {
    firstDay: formatDateInTimeZone(firstDay, timeZone),
    lastDay: formatDateInTimeZone(lastDay, timeZone)
  }
}